package com.jz.netthings.bloodsources.bean;

import com.baomidou.mybatisplus.enums.IdType;

import java.text.SimpleDateFormat;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.jz.netthings.bloodsources.constant.BloodSourcesConstant;
import com.jz.netthings.bloodsources.utils.BloodSourcesDateUtils;
import com.jz.netthings.exception.AdscmSystemException;
import lombok.Data;

import java.io.Serializable;

/**
 * <p>
 * 血源链接表
----表关系↓
--- 血源公告牌鉴权表
             |
---血源链接表
          ---提醒记录表
          ---未献浆记录表
          ---回访记录表
 

 * </p>
 *
 * @author 张凡
 * @since 2019-08-05
 */
@Data
public class XyLink implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 浆员卡号
     */
    @TableField("cardId")
    private String cardId;
    /**
     * 浆员ID
     */
    @TableField("linkProviderId")
    private Long linkProviderId;
    /**
     * 浆员姓名
     */
    @TableField("linkProviderName")
    private String linkProviderName;
    /**
     * 活跃等级
     */
    @TableField("activeLevel")
    private String activeLevel;
    /**
     * 浆员地址
     */
    private String address;
    /**
     * 是否使用微信
     */
    @TableField("useWeChart")
    private String useWeChart;
    /**
     * 最近采浆时间
     */
    @TableField("collectionDate")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private String collectionDate;
    /**
     * 链接护士ID
     */
    @TableField("useNurseId")
    private Long useNurseId;
    /**
     * 护士名称
     */
    @TableField("useNurseName")
    private String useNurseName;
    /**
     * 护士所属部门ID
     */
    @TableField("useNurseDeptId")
    private String useNurseDeptId;
    /**
     * 关联护士时间
     */
    @TableField("useNurseTime")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date useNurseTime;
    /**
     * 关联义工ID
     */
    @TableField("useVolunteeId")
    private Long useVolunteeId;
    /**
     * 关联义工名称
     */
    @TableField("useVolunteeName")
    private String useVolunteeName;
    /**
     * 关联义工时间
     */
    @TableField("useVolunteeTime")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date useVolunteeTime;
    /**
     * 介绍人ID
     */
    @TableField("useIntroducerId")
    private Long useIntroducerId;
    /**
     * 介绍人姓名
     */
    @TableField("useIntroducerName")
    private String useIntroducerName;
    /**
     * 总献浆量
     */
    @TableField("totalPulpingCount")
    private Integer totalPulpingCount;
    /**
     * 今年献浆量
     */
    @TableField("currentYearPulpingCount")
    private Integer currentYearPulpingCount;
    /**
     * 去年献浆量
     */
    @TableField("lastYearPulpingCount")
    private Integer lastYearPulpingCount;
    /**
     * 是否献浆提醒
     */
    @TableField("isPulpingMsg")
    private String isPulpingMsg;
    /**
     * 献浆提醒方式
     */
    @TableField("pulpingMsgType")
    //private String pulpingMsgType="按间隔天数提醒";
    private String pulpingMsgType;
    /**
     * 提前献浆提醒天数
     */
    @TableField("advancePulpingMsgDays")
    private String advancePulpingMsgDays;
    /**
     * 间隔献浆提醒天数
     */
    @TableField("intervalPulpingMsgDays")
    private String intervalPulpingMsgDays;
    /**
     * 家人参与献浆
     */
    @TableField("familyJoinPulping")
    private String familyJoinPulping;
    /**
     * 朋友参与献浆
     */
    @TableField("friendJoinPulping")
    private String friendJoinPulping;
    /**
     * 记录生成时间
     */
    @TableField("createTime")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 下次献浆时间
     */
    @TableField(exist = false)
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date nextCollDate;
    /**
     * 链接提醒状态0,关闭 1.开启,2延期
     */
    @TableField("linkState")
    private String linkState;

    /**
     * 判断是否进行提醒记录生成
     * @return
     */
    public Boolean isRemind() throws Exception {
        Boolean isRemind = false;
        //之所以将逻辑代码写在POJO中，侧重封装性，对象功能更具体。牺牲了JVM 变量池内存
        //流程梳理：
                //获取提醒方式（pulpingMsgType = 按提前天数提醒|按间隔天数提醒）
                //根据提醒方式进行相关参数获取 按提前天数提醒 =》advancePulpingMsgDays 提前天数| 按间隔天数提醒 ==》intervalPulpingMsgDays
        //编码：
            //获取当前时间
             Date curDate =  BloodSourcesDateUtils.getCurrentDate();

            //获取最近1次采浆日期 如果为空，则默认赋值为当前时间  this.collectionDate 为sql 端连采浆记录表 provider_collection 表查询其最近一次的采浆时间
              //  this.collectionDate  = null || "" 值处理 则默认赋当前的日期给当前
             this.collectionDate = (this.collectionDate==null||"".equals(this.collectionDate))?  BloodSourcesDateUtils.df.format(curDate):this.collectionDate;
             Date collTime =  BloodSourcesDateUtils.df.parse(this.collectionDate);  //最近1次的采浆时间 未做毛时间处理
        if(!"".equalsIgnoreCase(this.pulpingMsgType)&&this.pulpingMsgType.equalsIgnoreCase(BloodSourcesConstant.REMIND_TYPE_ADVANCE)){    //提前
            //获取提前天数
            if(!"".equals(this.advancePulpingMsgDays)){
                //相差日期
                Long dDays = BloodSourcesDateUtils.DdateForTwoDate(curDate,collTime);
                switch (this.advancePulpingMsgDays){
                    case  BloodSourcesConstant.DATE_TYPE_DAYS_EMPTY:  //【空】
                           //空 即默认14天提醒
                           //获取最近采浆时间过后14天的对应时间 【即】 当前浆员最近一次采浆【14】天过后的日期
                            // 如果当前时间 - 最近1次采浆时间 = 间隔时间，则表示到达提醒时间
                           if(dDays ==BloodSourcesConstant.DATE_TYPE_DAYS_FOURTEEN){
                               isRemind = true;
                               this.nextCollDate = curDate;
                           }else
                               if(dDays>BloodSourcesConstant.DATE_TYPE_DAYS_FOURTEEN){
                                   Long cDay = dDays%BloodSourcesConstant.DATE_TYPE_DAYS_FOURTEEN; //取余进行取余，如果刚好被整除尽，则表示刚好是间隔天数的倍数，即到达提醒时间
                                   if(cDay==0L){
                                       isRemind = true;
                                       this.nextCollDate = curDate;
                                   }
                               }
                           break;
                       case  BloodSourcesConstant.DATE_TYPE_DAYS_ONE:   //【1天】
                              //提前1天提醒
                           if(dDays ==BloodSourcesConstant.DATE_TYPE_DAYS_THIRTEEN){
                               isRemind = true;
                               this.nextCollDate =BloodSourcesDateUtils.getDateForCondition(curDate,1L,BloodSourcesConstant.DATE_TYPE_ADD);     //下次献浆时间
                           }else
                           if(dDays>BloodSourcesConstant.DATE_TYPE_DAYS_THIRTEEN){
                               Long cDay = dDays%BloodSourcesConstant.DATE_TYPE_DAYS_THIRTEEN; //取余进行取余，如果刚好被整除尽，则表示刚好是间隔天数的倍数，即到达提醒时间
                               if(cDay==0L){
                                   isRemind = true;
                                   this.nextCollDate =BloodSourcesDateUtils.getDateForCondition(curDate,1L,BloodSourcesConstant.DATE_TYPE_ADD); //下次献浆时间
                               }
                           }
                           break;
                    case  BloodSourcesConstant.DATE_TYPE_DAYS_TWO:   //【2天】
                        //提前2天提醒
                        if(dDays ==BloodSourcesConstant.DATE_TYPE_DAYS_TWELVE){
                            isRemind = true;
                            this.nextCollDate =BloodSourcesDateUtils.getDateForCondition(curDate,2L,BloodSourcesConstant.DATE_TYPE_ADD);    //下次献浆时间
                        }else
                        if(dDays>BloodSourcesConstant.DATE_TYPE_DAYS_TWELVE){
                            Long cDay = dDays%BloodSourcesConstant.DATE_TYPE_DAYS_TWELVE; //取余进行取余，如果刚好被整除尽，则表示刚好是间隔天数的倍数，即到达提醒时间
                            if(cDay==0L){
                                isRemind = true;
                                this.nextCollDate =BloodSourcesDateUtils.getDateForCondition(curDate,2L,BloodSourcesConstant.DATE_TYPE_ADD); //下次献浆时间
                            }
                        }
                           break;
                    case  BloodSourcesConstant.DATE_TYPE_DAYS_THREE: //【3天】
                        //提前3天提醒
                        if(dDays ==BloodSourcesConstant.DATE_TYPE_DAYS_ELEVEN){
                            isRemind = true;
                            this.nextCollDate =BloodSourcesDateUtils.getDateForCondition(curDate,3L,BloodSourcesConstant.DATE_TYPE_ADD);
                        }else
                        if(dDays>BloodSourcesConstant.DATE_TYPE_DAYS_ELEVEN){
                            Long cDay = dDays%BloodSourcesConstant.DATE_TYPE_DAYS_ELEVEN; //取余进行取余，如果刚好被整除尽，则表示刚好是间隔天数的倍数，即到达提醒时间
                            if(cDay==0L){
                                isRemind = true;
                                this.nextCollDate =BloodSourcesDateUtils.getDateForCondition(curDate,3L,BloodSourcesConstant.DATE_TYPE_ADD); //下次献浆时间
                            }
                        }
                        break;
                     default:
                           //没有匹配到的数据不用生成
                           isRemind = false;
                           ;
                }
            }
        }else
        if(!"".equalsIgnoreCase(pulpingMsgType)&&pulpingMsgType.equalsIgnoreCase(BloodSourcesConstant.REMIND_TYPE_INTERVAL)){   //间隔
                        //间隔时间默认间隔提醒的时间不得小于14天，前端页面表单录入如果未做控制，则后台判定该间隔值，如果小于14天则默认判定为14天 相关字段 intervalPulpingMsgDays
                        if(!"".equals(this.intervalPulpingMsgDays)&&intervalPulpingMsgDays!=null){
                            this.intervalPulpingMsgDays =   Integer.parseInt(this.intervalPulpingMsgDays)<14?14+"":this.intervalPulpingMsgDays;
                            Long intervalDay =  Long.parseLong(this.intervalPulpingMsgDays);
                             //（如果最近1次献浆时间+间隔天数）x n <= 当前时间
                            //获取当前时间和最近采浆时间的时间差值  当前时间 - 最近采浆时间 = 差值
                            Long dDays = BloodSourcesDateUtils.DdateForTwoDate(curDate,collTime);
                            if(dDays>intervalDay){ //如果 差值>间隔天数 则证明可以进行提醒消息生成
                                Long cDay = dDays%intervalDay;
                                if(cDay==0L){
                                isRemind = true;
                                this.nextCollDate = curDate;
                                }
                            }else
                             if(dDays==intervalDay){//如果 差值=间隔天数 则证明可以直接进行提醒消息生成 最近献浆时间距离间隔天数第一次生成提醒消息
                                isRemind = true;
                            }
                        }
        }

       return isRemind;
    }
    //测试
    public static void main(String[] args) {
        XyLink testX =    new XyLink();

        try {
            System.out.println(testX.isRemind());
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
